const jwt = require('jsonwebtoken');

// 密钥建议放在环境变量中，避免硬编码
const JWT_SECRET = '666'; // 实际项目中可用 process.env.JWT_SECRET

/**
 * 生成 token
 * @param {Object} payload - 存储在 token 中的数据（如用户信息）
 * @param {string} expiresIn - 过期时间（如 '1h'、'7d'，默认 1 天）
 * @returns {string} 生成的 token
 */
function sign(payload, expiresIn = '1d') {
  return jwt.sign(payload, JWT_SECRET, {
    expiresIn: expiresIn // 支持字符串（'1h'）或数字（秒）
  });
}

/**
 * 验证 token 的中间件（用于接口权限校验）
 * 正确处理 Bearer token 格式，并挂载完整用户信息到 ctx
 */
function verify() {
  return async (ctx, next) => {
    try {
      // 1. 获取并解析 Authorization 头
      const authHeader = ctx.headers.authorization;
      if (!authHeader) {
        ctx.status = 401;
        return ctx.body = { code: '0', msg: '请先登录（未携带 token）' };
      }

      // 2. 提取 token（去除 Bearer 前缀）
      const token = authHeader.split(' ')[1];
      if (!token) {
        ctx.status = 401;
        return ctx.body = { code: '0', msg: 'token 格式错误（应为 Bearer <token>）' };
      }

      // 3. 验证 token 有效性
      const decoded = jwt.verify(token, JWT_SECRET);

      // 4. 验证通过，挂载完整用户信息到 ctx
      ctx.user = decoded; // 后续接口可通过 ctx.user 获取 id、username 等

      // 5. 继续执行后续中间件/接口
      await next();

    } catch (error) {
      // 区分错误类型，返回更具体的提示
      ctx.status = 401;
      if (error.name === 'TokenExpiredError') {
        ctx.body = { code: '0', msg: 'token 已过期，请刷新' };
      } else if (error.name === 'JsonWebTokenError') {
        ctx.body = { code: '0', msg: 'token 无效（签名错误或被篡改）' };
      } else {
        ctx.body = { code: '0', msg: '登录状态验证失败' };
      }
    }
  };
}

/**
 * 验证 refresh_token 有效性（用于刷新 token 接口）
 * @param {string} token - 需要验证的 refresh_token
 * @returns {Object|false} 解析后的用户信息（验证通过）或 false（失败）
 */
function refreshVerify(token) {
  try {
    return jwt.verify(token, JWT_SECRET);
  } catch (error) {
    return false; // 验证失败（过期或无效）
  }
}

module.exports = { sign, verify, refreshVerify };